#include "io.h"



static const uint8_t dinType[] = {	DIN_LOW,	DIN_LOW,	DIN_LOW,	DIN_LOW,\
                                    DIN_LOW,	DIN_LOW,	DIN_LOW,	DIN_LOW,
								};
static uint32_t dinTypeWord = 0
							
							;

static port_pin_t din[DIN_NUM] = {
							{DI_1_GPIO_Port ,DI_1_Pin },
							{DI_2_GPIO_Port ,DI_2_Pin },
							{DI_3_GPIO_Port ,DI_3_Pin },
							{DI_4_GPIO_Port ,DI_4_Pin },
							{DI_5_GPIO_Port ,DI_5_Pin },
							{DI_6_GPIO_Port ,DI_6_Pin },
							{DI_7_GPIO_Port ,DI_7_Pin },
                            {DI_8_GPIO_Port ,DI_8_Pin }
						};

static port_pin_t dout[DOUT_NUM] = {
							{DO_1_GPIO_Port,DO_1_Pin},
							{DO_2_GPIO_Port,DO_2_Pin},
							{DO_3_GPIO_Port,DO_3_Pin},
							{DO_4_GPIO_Port,DO_4_Pin},
                            {DO_5_GPIO_Port,DO_5_Pin},
                            {DO_6_GPIO_Port,DO_6_Pin},
                            {DO_7_GPIO_Port,DO_7_Pin},
                            {DO_8_GPIO_Port,DO_8_Pin},
                            {DO_9_GPIO_Port,DO_9_Pin},
                            {DO_10_GPIO_Port,DO_10_Pin},
                            {DO_11_GPIO_Port,DO_11_Pin},
                            {DO_12_GPIO_Port,DO_12_Pin},
                            {DO_13_GPIO_Port,DO_13_Pin},
                            {DO_14_GPIO_Port,DO_14_Pin},
						};

uint16_t diValue;
	

void IO_Init(void)
{
	for(int i=0;i<sizeof(dinType)/sizeof(dinType[0]);i++)
	{
		if(dinType[i] == DIN_LOW)
		{
			dinTypeWord |= (1<<i);
		}
	}
}	
void Dout_Write(uint8_t* pOut)
{
	static uint16_t lastOut = 0;
	uint16_t out = pOut[0];
	out |= (pOut[1]<<8);
	if(lastOut == out)
	{
		return;
	}
	else
	{
		lastOut = out;
	}

	for(int i=0;i<DOUT_NUM;i++)
	{
		if((out>>i)&0x01)
		{
			HAL_GPIO_WritePin(dout[i].port,dout[i].pin,GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(dout[i].port,dout[i].pin,GPIO_PIN_SET);
		}
	}
	
}

void Dout_Write_Channel(uint8_t ch,uint8_t value)
{
	if(ch < DOUT_NUM){
	    if(value){
	        HAL_GPIO_WritePin(dout[ch].port,dout[ch].pin,GPIO_PIN_RESET);
	    }else{
	        HAL_GPIO_WritePin(dout[ch].port,dout[ch].pin,GPIO_PIN_SET);
	    }
	}
}

void Din_Read(void)
{
	static uint16_t diFilter[4] = {0};
	static uint32_t diFilterIndex = 0;
	uint16_t tempV = 0;
	for(int i=0;i<DIN_NUM;i++)
	{
		if(HAL_GPIO_ReadPin(din[i].port,din[i].pin))
		{
			tempV |= (1<<i);
		}
	}
	diFilter[diFilterIndex++ & 0x03] = tempV;
	diValue |=  (diFilter[0] & diFilter[1] & diFilter[2] & diFilter[3]);
	diValue &= (diFilter[0] | diFilter[1] | diFilter[2] | diFilter[3]);
	
}

void Din_Get(uint8_t* buf)
{
	buf[0] = (diValue&0xFF)^dinTypeWord;
#if DIN_NUM > 8
	buf[1] = ((diValue>>8)&0xFF)^(dinTypeWord>>8);
#else
    buf[1] = 0;
#endif
	return;
}

						
						
						
						



